package 题目集.滑动窗口.ch02_不定长窗口;

import org.junit.Test;

/**
 * 给定一个含有 n 个正整数的数组和一个正整数 target 。
 * 找出该数组中满足其总和大于等于 target 的长度最小的 连续
 * 子数组
 *  [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。
 *  这题可以用二分
 *  https://leetcode.cn/problems/minimum-size-subarray-sum/description/
 */
public class ch01_长度最小的子数组 {

    /**
     * 滑动窗口
     * 判断滑动窗口的值是否大于等于target
     * 如果大于则记录长度，然后窗口左边界右移
     */
    public int minSubArrayLen2(int target, int[] nums) {
        int res = Integer.MAX_VALUE;
        long sum = 0;
        for (int l = 0, r = 0; r < nums.length; r++) {  //这里是遍历到n的变量，即右端点
            sum += nums[r];
            while (l <= r && sum >= target) {   //这里是不固定的变量以及它移动的条件，即左侧的起始位置
                res = Math.min(r - l + 1, res);
                sum -= nums[l++];
            }
        }
        return res == Integer.MAX_VALUE ? 0 : res;
    }

    @Test
    public void test() {
        int[] nums = {2, 3, 1, 2, 4, 3};
        int t = 7;
        System.out.println(minSubArrayLen2(t, nums));
    }
}
